@codeyam/codeyam-cli 0.1.20 → 0.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/analyzer-template/.build-info.json +7 -7
  2. package/analyzer-template/log.txt +3 -3
  3. package/analyzer-template/package.json +1 -1
  4. package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +5 -1
  5. package/analyzer-template/packages/analyze/src/lib/files/analyze/findOrCreateEntity.ts +1 -0
  6. package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +4 -0
  7. package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +4 -0
  8. package/analyzer-template/packages/aws/package.json +1 -1
  9. package/analyzer-template/packages/database/src/lib/loadEntity.ts +11 -4
  10. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts +4 -1
  11. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.d.ts.map +1 -1
  12. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js +4 -4
  13. package/analyzer-template/packages/github/dist/database/src/lib/loadEntity.js.map +1 -1
  14. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts +3 -1
  15. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.d.ts.map +1 -1
  16. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js +22 -1
  17. package/analyzer-template/packages/utils/dist/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  18. package/analyzer-template/packages/utils/src/lib/fs/rsyncCopy.ts +27 -0
  19. package/codeyam-cli/src/commands/editor.js +185 -59
  20. package/codeyam-cli/src/commands/editor.js.map +1 -1
  21. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js +630 -23
  22. package/codeyam-cli/src/utils/__tests__/editorAudit.test.js.map +1 -1
  23. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js +127 -0
  24. package/codeyam-cli/src/utils/__tests__/registerScenarioResult.test.js.map +1 -0
  25. package/codeyam-cli/src/utils/analyzer.js +8 -0
  26. package/codeyam-cli/src/utils/analyzer.js.map +1 -1
  27. package/codeyam-cli/src/utils/editorAudit.js +113 -12
  28. package/codeyam-cli/src/utils/editorAudit.js.map +1 -1
  29. package/codeyam-cli/src/utils/registerScenarioResult.js +52 -0
  30. package/codeyam-cli/src/utils/registerScenarioResult.js.map +1 -0
  31. package/codeyam-cli/src/webserver/app/lib/clientErrors.js +3 -0
  32. package/codeyam-cli/src/webserver/app/lib/clientErrors.js.map +1 -1
  33. package/codeyam-cli/src/webserver/build/client/assets/api.editor-save-scenario-data-l0sNRNKZ.js +1 -0
  34. package/codeyam-cli/src/webserver/build/client/assets/api.editor-schema-l0sNRNKZ.js +1 -0
  35. package/codeyam-cli/src/webserver/build/client/assets/{cy-logo-cli-CCKUIm0S.svg → cy-logo-cli-CJzc4vOH.svg} +2 -2
  36. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DODLxLcw.js +1 -0
  37. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-Dx-h1rJK.js +130 -0
  38. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-NTuLi4Xg.js +41 -0
  39. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.dev-KTQuL0aj.js → entity._sha.scenarios._scenarioId.dev-BA5L8bU-.js} +1 -1
  40. package/codeyam-cli/src/webserver/build/client/assets/{entity._sha.scenarios._scenarioId.fullscreen-C6eeL24i.js → entity._sha.scenarios._scenarioId.fullscreen-D4dmRgvO.js} +1 -1
  41. package/codeyam-cli/src/webserver/build/client/assets/globals-BrPXT1iR.css +1 -0
  42. package/codeyam-cli/src/webserver/build/client/assets/manifest-5025e428.js +1 -0
  43. package/codeyam-cli/src/webserver/build/client/assets/{root-BxUQigda.js → root-BCx1S8Z3.js} +26 -13
  44. package/codeyam-cli/src/webserver/build/server/assets/{analysisRunner-B_PsTAb1.js → analysisRunner-C1kjC9UJ.js} +1 -1
  45. package/codeyam-cli/src/webserver/build/server/assets/{index-CjLhfz6Z.js → index-C91yWWCI.js} +1 -1
  46. package/codeyam-cli/src/webserver/build/server/assets/{init-BEqlbI84.js → init-Dkas-RUS.js} +1 -1
  47. package/codeyam-cli/src/webserver/build/server/assets/server-build-pulXLTrG.js +640 -0
  48. package/codeyam-cli/src/webserver/build/server/index.js +1 -1
  49. package/codeyam-cli/src/webserver/build-info.json +5 -5
  50. package/codeyam-cli/src/webserver/terminalServer.js +10 -3
  51. package/codeyam-cli/src/webserver/terminalServer.js.map +1 -1
  52. package/package.json +1 -1
  53. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +4 -1
  54. package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
  55. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js +1 -0
  56. package/packages/analyze/src/lib/files/analyze/findOrCreateEntity.js.map +1 -1
  57. package/packages/analyze/src/lib/files/analyzeChange.js +1 -0
  58. package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
  59. package/packages/analyze/src/lib/files/analyzeInitial.js +1 -0
  60. package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
  61. package/packages/database/src/lib/loadEntity.js +4 -4
  62. package/packages/database/src/lib/loadEntity.js.map +1 -1
  63. package/packages/utils/src/lib/fs/rsyncCopy.js +22 -1
  64. package/packages/utils/src/lib/fs/rsyncCopy.js.map +1 -1
  65. package/codeyam-cli/src/webserver/build/client/assets/cy-logo-cli-DcX-ZS3p.js +0 -1
  66. package/codeyam-cli/src/webserver/build/client/assets/editor.entity.(_sha)-DII1pg_z.js +0 -58
  67. package/codeyam-cli/src/webserver/build/client/assets/editorPreview-oepecPae.js +0 -41
  68. package/codeyam-cli/src/webserver/build/client/assets/globals-Yn9W3zp3.css +0 -1
  69. package/codeyam-cli/src/webserver/build/client/assets/manifest-cdf2c0a7.js +0 -1
  70. package/codeyam-cli/src/webserver/build/server/assets/server-build-YI63xTu4.js +0 -553
@@ -1,10 +1,10 @@
1
1
  {
2
- "buildTimestamp": "2026-03-22T12:08:27.765Z",
3
- "buildTime": 1774181307765,
4
- "gitCommit": "4ae50914b19ee5c5cec03ceca2a8ec32fd82c0d4",
2
+ "buildTimestamp": "2026-03-23T18:15:43.332Z",
3
+ "buildTime": 1774289743332,
4
+ "gitCommit": "56a7e07b8443b0a3e64a46dc6ba44404297a9a2e",
5
5
  "nodeVersion": "v20.20.1",
6
- "contentHash": "faebee669133648dadbd8892432f1e62fa8bbf062c5cc67690819cb8f39cfa86",
7
- "buildNumber": 1148,
8
- "semanticVersion": "0.1.1148",
9
- "version": "0.1.1148 (2026-03-22T12:08+faebee6)"
6
+ "contentHash": "6c4394ec0578dec94ea4076bc8417fa3e6c6cbcad956c30ed107dcaeaa37e131",
7
+ "buildNumber": 1193,
8
+ "semanticVersion": "0.1.1193",
9
+ "version": "0.1.1193 (2026-03-23T18:15+6c4394e)"
10
10
  }
@@ -1,7 +1,7 @@
1
1
 
2
- [3/22/2026, 12:08:27 PM] > codeyam-combo@1.0.0 mergeDependencies
3
- [3/22/2026, 12:08:27 PM] > node ./scripts/mergePackageJsonFiles.cjs
2
+ [3/23/2026, 6:15:43 PM] > codeyam-combo@1.0.0 mergeDependencies
3
+ [3/23/2026, 6:15:43 PM] > node ./scripts/mergePackageJsonFiles.cjs
4
4
 
5
5
 
6
- [3/22/2026, 12:08:27 PM] Merged dependencies into root package.json
6
+ [3/23/2026, 6:15:43 PM] Merged dependencies into root package.json
7
7
 
@@ -9,7 +9,7 @@
9
9
  "dependencies": {
10
10
  "@aws-sdk/client-cloudwatch-logs": "^3.990.0",
11
11
  "@aws-sdk/client-cloudfront": "^3.990.0",
12
- "@aws-sdk/client-codebuild": "^3.1000.0",
12
+ "@aws-sdk/client-codebuild": "^3.1014.0",
13
13
  "@aws-sdk/client-dynamodb": "^3.990.0",
14
14
  "@aws-sdk/client-ec2": "^3.990.0",
15
15
  "@aws-sdk/client-ecr": "^3.990.0",
@@ -1050,7 +1050,11 @@ export class ScopeDataStructure {
1050
1050
  ) {
1051
1051
  addEquivalencyCallCount++;
1052
1052
 
1053
- if (addEquivalencyCallCount > 50000) {
1053
+ const limit =
1054
+ typeof (globalThis as any).__CODEYAM_EQUIVALENCY_LIMIT === 'number'
1055
+ ? (globalThis as any).__CODEYAM_EQUIVALENCY_LIMIT
1056
+ : 50000;
1057
+ if (addEquivalencyCallCount > limit) {
1054
1058
  console.error('INFINITE LOOP DETECTED in addEquivalency', {
1055
1059
  callCount: addEquivalencyCallCount,
1056
1060
  path,
@@ -111,6 +111,7 @@ export default async function findOrCreateEntity({
111
111
  entity = await loadEntity({
112
112
  projectId: project.id,
113
113
  sha,
114
+ silent: true, // Entity not existing yet is the normal path — we create it below
114
115
  });
115
116
  }
116
117
 
@@ -91,6 +91,10 @@ export default async function analyzeChange({
91
91
  // Structure phase: CPU-intensive, serialize via semaphore if provided
92
92
  if (!steps || steps.includes(Step.Structure)) {
93
93
  if (structureSemaphore) {
94
+ awsLogDebugLevel(
95
+ 1,
96
+ `Waiting for structure semaphore for ${entity.name}...`,
97
+ );
94
98
  await structureSemaphore.acquire();
95
99
  }
96
100
  try {
@@ -58,6 +58,10 @@ export default async function analyzeInitial({
58
58
  // Structure phase: CPU-intensive, serialize via semaphore if provided
59
59
  if (!steps || steps.includes(Step.Structure)) {
60
60
  if (structureSemaphore) {
61
+ awsLogDebugLevel(
62
+ 1,
63
+ `Waiting for structure semaphore for ${entity.name}...`,
64
+ );
61
65
  await structureSemaphore.acquire();
62
66
  }
63
67
  try {
@@ -11,7 +11,7 @@
11
11
  "author": "",
12
12
  "license": "ISC",
13
13
  "dependencies": {
14
- "@aws-sdk/client-codebuild": "^3.1000.0",
14
+ "@aws-sdk/client-codebuild": "^3.1014.0",
15
15
  "@aws-sdk/client-cloudwatch-logs": "^3.990.0",
16
16
  "@aws-sdk/client-dynamodb": "^3.990.0",
17
17
  "@aws-sdk/client-ecr": "^3.990.0",
@@ -7,6 +7,9 @@ import { getEntityBranchesAsJson } from './loadEntityBranches';
7
7
  export interface loadEntityArgs {
8
8
  projectId: string;
9
9
  sha: string;
10
+ /** When true, suppress "Entity not found" log. Use when the caller expects
11
+ * the entity might not exist (e.g., findOrCreateEntity on fresh databases). */
12
+ silent?: boolean;
10
13
  }
11
14
 
12
15
  export interface loadEntityByNameAndPathArgs {
@@ -15,7 +18,11 @@ export interface loadEntityByNameAndPathArgs {
15
18
  filePath: string;
16
19
  }
17
20
 
18
- export default async function loadEntity({ projectId, sha }: loadEntityArgs) {
21
+ export default async function loadEntity({
22
+ projectId,
23
+ sha,
24
+ silent,
25
+ }: loadEntityArgs) {
19
26
  const db = getDatabase();
20
27
 
21
28
  try {
@@ -33,9 +40,9 @@ export default async function loadEntity({ projectId, sha }: loadEntityArgs) {
33
40
  .executeTakeFirst();
34
41
 
35
42
  if (!entity) {
36
- // Only log at debug level - Entity not found is expected in E2E baseline mode
37
- // where entities are created fresh and don't exist in the database yet
38
- if (process.env.CODEYAM_E2E_BASELINE_MODE !== 'true') {
43
+ // Entity not found is expected in baseline mode (fresh DB) and in
44
+ // findOrCreateEntity where the caller creates the entity if missing.
45
+ if (!silent && process.env.CODEYAM_E2E_BASELINE_MODE !== 'true') {
39
46
  awsLog(
40
47
  `CodeYam Error: Load Entity: Entity not found (sha=${sha?.substring(0, 12)})`,
41
48
  null,
@@ -1,13 +1,16 @@
1
1
  export interface loadEntityArgs {
2
2
  projectId: string;
3
3
  sha: string;
4
+ /** When true, suppress "Entity not found" log. Use when the caller expects
5
+ * the entity might not exist (e.g., findOrCreateEntity on fresh databases). */
6
+ silent?: boolean;
4
7
  }
5
8
  export interface loadEntityByNameAndPathArgs {
6
9
  projectId: string;
7
10
  name: string;
8
11
  filePath: string;
9
12
  }
10
- export default function loadEntity({ projectId, sha }: loadEntityArgs): Promise<import("~codeyam/types").Entity>;
13
+ export default function loadEntity({ projectId, sha, silent, }: loadEntityArgs): Promise<import("~codeyam/types").Entity>;
11
14
  /**
12
15
  * Load entity by name and file path instead of SHA.
13
16
  * This is useful for E2E tests where we want to avoid hardcoding SHAs.
@@ -1 +1 @@
1
- {"version":3,"file":"loadEntity.d.ts","sourceRoot":"","sources":["../../../../../database/src/lib/loadEntity.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAA8B,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,cAAc,4CAyC1E;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAC5C,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE,2BAA2B,4CAwC7B"}
1
+ {"version":3,"file":"loadEntity.d.ts","sourceRoot":"","sources":["../../../../../database/src/lib/loadEntity.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ;oFACgF;IAChF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAA8B,UAAU,CAAC,EACvC,SAAS,EACT,GAAG,EACH,MAAM,GACP,EAAE,cAAc,4CAyChB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAC5C,SAAS,EACT,IAAI,EACJ,QAAQ,GACT,EAAE,2BAA2B,4CAwC7B"}
@@ -2,7 +2,7 @@ import { getDatabase } from './kysely/db';
2
2
  import dbToEntity from './dbToEntity';
3
3
  import { awsLog } from '~codeyam/utils';
4
4
  import { getEntityBranchesAsJson } from './loadEntityBranches';
5
- export default async function loadEntity({ projectId, sha }) {
5
+ export default async function loadEntity({ projectId, sha, silent, }) {
6
6
  const db = getDatabase();
7
7
  try {
8
8
  const entity = await db
@@ -14,9 +14,9 @@ export default async function loadEntity({ projectId, sha }) {
14
14
  .where('entities.sha', '=', sha)
15
15
  .executeTakeFirst();
16
16
  if (!entity) {
17
- // Only log at debug level - Entity not found is expected in E2E baseline mode
18
- // where entities are created fresh and don't exist in the database yet
19
- if (process.env.CODEYAM_E2E_BASELINE_MODE !== 'true') {
17
+ // Entity not found is expected in baseline mode (fresh DB) and in
18
+ // findOrCreateEntity where the caller creates the entity if missing.
19
+ if (!silent && process.env.CODEYAM_E2E_BASELINE_MODE !== 'true') {
20
20
  awsLog(`CodeYam Error: Load Entity: Entity not found (sha=${sha?.substring(0, 12)})`, null, {
21
21
  projectId,
22
22
  sha,
@@ -1 +1 @@
1
- {"version":3,"file":"loadEntity.js","sourceRoot":"","sources":["../../../../../database/src/lib/loadEntity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loadEntity.js","sourceRoot":"","sources":["../../../../../database/src/lib/loadEntity.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
- export default function rsyncCopy({ sourcePath, destinationPath, excludes, keepExisting, silent, extraArgs, }: {
1
+ export default function rsyncCopy({ sourcePath, destinationPath, excludes, keepExisting, silent, extraArgs, timeoutMs, }: {
2
2
  sourcePath: string;
3
3
  destinationPath: string;
4
4
  excludes?: string[];
5
5
  keepExisting?: boolean;
6
6
  silent?: boolean;
7
7
  extraArgs?: string[];
8
+ /** Timeout in milliseconds. Defaults to 300s (5 min). */
9
+ timeoutMs?: number;
8
10
  }): Promise<void>;
9
11
  //# sourceMappingURL=rsyncCopy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rsyncCopy.d.ts","sourceRoot":"","sources":["../../../../../src/lib/fs/rsyncCopy.ts"],"names":[],"mappings":"AAqFA,wBAA8B,SAAS,CAAC,EACtC,UAAU,EACV,eAAe,EACf,QAAa,EACb,YAAoB,EACpB,MAAc,EACd,SAAc,GACf,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFhB"}
1
+ {"version":3,"file":"rsyncCopy.d.ts","sourceRoot":"","sources":["../../../../../src/lib/fs/rsyncCopy.ts"],"names":[],"mappings":"AAqFA,wBAA8B,SAAS,CAAC,EACtC,UAAU,EACV,eAAe,EACf,QAAa,EACb,YAAoB,EACpB,MAAc,EACd,SAAc,EACd,SAAmB,GACpB,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0GhB"}
@@ -71,7 +71,7 @@ function tryApfsClone({ sourcePath, destinationPath, excludes, silent, }) {
71
71
  return false;
72
72
  }
73
73
  }
74
- export default async function rsyncCopy({ sourcePath, destinationPath, excludes = [], keepExisting = false, silent = false, extraArgs = [], }) {
74
+ export default async function rsyncCopy({ sourcePath, destinationPath, excludes = [], keepExisting = false, silent = false, extraArgs = [], timeoutMs = 300000, }) {
75
75
  const startTime = Date.now();
76
76
  // On macOS, try APFS copy-on-write clone first (near-instant).
77
77
  // Skip when extraArgs are provided since those are rsync-specific flags
@@ -110,7 +110,23 @@ export default async function rsyncCopy({ sourcePath, destinationPath, excludes
110
110
  }
111
111
  rsyncArgs.push(source, dest);
112
112
  const rsyncProcess = spawn('rsync', rsyncArgs);
113
+ let settled = false;
114
+ const timer = timeoutMs
115
+ ? setTimeout(() => {
116
+ if (!settled) {
117
+ settled = true;
118
+ rsyncProcess.kill('SIGKILL');
119
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
120
+ reject(new Error(`rsync timed out after ${duration}s syncing ${sourcePath} → ${destinationPath}`));
121
+ }
122
+ }, timeoutMs)
123
+ : undefined;
113
124
  rsyncProcess.on('exit', (code) => {
125
+ if (settled)
126
+ return;
127
+ settled = true;
128
+ if (timer)
129
+ clearTimeout(timer);
114
130
  if (code === 0) {
115
131
  if (!silent) {
116
132
  const duration = ((Date.now() - startTime) / 1000).toFixed(1);
@@ -126,6 +142,11 @@ export default async function rsyncCopy({ sourcePath, destinationPath, excludes
126
142
  }
127
143
  });
128
144
  rsyncProcess.on('error', (error) => {
145
+ if (settled)
146
+ return;
147
+ settled = true;
148
+ if (timer)
149
+ clearTimeout(timer);
129
150
  if (!silent) {
130
151
  console.log('Error occurred:', error);
131
152
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rsyncCopy.js","sourceRoot":"","sources":["../../../../../src/lib/fs/rsyncCopy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rsyncCopy.js","sourceRoot":"","sources":["../../../../../src/lib/fs/rsyncCopy.ts"],"names":[],"mappings":"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"}
@@ -90,6 +90,7 @@ export default async function rsyncCopy({
90
90
  keepExisting = false,
91
91
  silent = false,
92
92
  extraArgs = [],
93
+ timeoutMs = 300_000,
93
94
  }: {
94
95
  sourcePath: string;
95
96
  destinationPath: string;
@@ -97,6 +98,8 @@ export default async function rsyncCopy({
97
98
  keepExisting?: boolean;
98
99
  silent?: boolean;
99
100
  extraArgs?: string[];
101
+ /** Timeout in milliseconds. Defaults to 300s (5 min). */
102
+ timeoutMs?: number;
100
103
  }): Promise<void> {
101
104
  const startTime = Date.now();
102
105
 
@@ -147,7 +150,27 @@ export default async function rsyncCopy({
147
150
 
148
151
  const rsyncProcess = spawn('rsync', rsyncArgs);
149
152
 
153
+ let settled = false;
154
+ const timer = timeoutMs
155
+ ? setTimeout(() => {
156
+ if (!settled) {
157
+ settled = true;
158
+ rsyncProcess.kill('SIGKILL');
159
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
160
+ reject(
161
+ new Error(
162
+ `rsync timed out after ${duration}s syncing ${sourcePath} → ${destinationPath}`,
163
+ ),
164
+ );
165
+ }
166
+ }, timeoutMs)
167
+ : undefined;
168
+
150
169
  rsyncProcess.on('exit', (code) => {
170
+ if (settled) return;
171
+ settled = true;
172
+ if (timer) clearTimeout(timer);
173
+
151
174
  if (code === 0) {
152
175
  if (!silent) {
153
176
  const duration = ((Date.now() - startTime) / 1000).toFixed(1);
@@ -173,6 +196,10 @@ export default async function rsyncCopy({
173
196
  });
174
197
 
175
198
  rsyncProcess.on('error', (error) => {
199
+ if (settled) return;
200
+ settled = true;
201
+ if (timer) clearTimeout(timer);
202
+
176
203
  if (!silent) {
177
204
  console.log('Error occurred:', error);
178
205
  }